
package highvoltage;

import java.util.List;

import highvoltage.skeletonHelpers.*;

/**
 * A jármû számára valósítja meg a pályareprezentáció absztrakcióját (vagy így a
 * jármû független marad a konkrét pályareprezentációtól).
 * 
 * @author Tomi
 * @version 1.0
 * @created 16-márc.-2010 21:08:08
 */
public class VehicleWrapper implements ISteppable
{

	/**
	 * Az az útelem, amin jelenleg tartózkodik a csomagolt jármû.
	 */
	private RoadSegment _currentRS = null;
	protected RoadSegmentWrapper _destinationRSW = null;
	/**
	 * Kezdõértéke minden segmenten 1 / speed. (1 / (Segment / Tick) == Tick /
	 * Segment).
	 */
	protected int _ticksRemaining;
	/**
	 * Számított forgalmi súly eltárolva.
	 */
	protected int _trafficWeight;
	/**
	 * A csomagolt jármû.
	 */
	protected Vehicle _vehicle;

	public VehicleWrapper( Vehicle v )
	{
		Logger.print( "VehicleWrapper::VehicleWrapper()", this );

		_vehicle = v;

		Logger.call( "Vehicle::setWrapper( this )", v );
		v.setWrapper( this );

		Logger.ret();
	}

	/**
	 * Csökkenti a jármû sebessége alapján a ticksRemaining attribútumot.
	 */
	private void decreaseTicks()
	{
		Logger.print( "VehicleWrapper::decreaseTicks()", this );
		Logger.ret();
	}

	/**
	 * Visszaadja az aktuális forgalmi súly értéket.
	 */
	public int getTrafficWeight()
	{
		Logger.print( "VehicleWrapper::getTrafficWeight()", this );
		Logger.ret();

		return 0;
	}

	/**
	 * Vissatér a becsomagolt járművel.
	 * 
	 * @return Vehicle A becsomagolt jámű.
	 */
	public Vehicle getVehicle()
	{
		return _vehicle;
	}

	/**
	 * A jármû megsemmisítésére szolgáló metódus. Meghívja a <i>currentRS
	 * </i><b>leave</b>() metódusát és null-ra állítja a vehicle referenciát.
	 */
	public void kill()
	{
		Logger.print( "VehicleWrapper::kill()", this );

		if ( _currentRS != null )
		{
			Logger.call( "RoadSegment::leave()", _currentRS );
			_currentRS.leave();
		}

		Logger.ret();
	}

	/**
	 * Jármû átmozgatási a cél útelemre.
	 */
	public void moveVehicle()
	{
		Logger.print( "VehicleWrapper::moveVehicle()", this );

		Logger.ret();
	}

	/**
	 * Órajel fogadására szolgáló metódus.
	 */
	public void step()
	{
		Logger.print( "VehiclWrapper::step()", this );

		if ( _destinationRSW == null )
		{
			if ( UserInput.yesNo( "Valaszt iranyt?" ) )
			{
				Logger.call( "RoadSegment::getAngles()", _currentRS );
				List<Float> angles = _currentRS.getAngles();

				Logger.call( "Vehicle::chooseAngle", _vehicle );
				float angle = _vehicle.chooseAngle( angles );

				if ( UserInput.yesNo( "Ervenyes a valasztott irany?" ) )
				{
					Logger.print( "Megj.: A szkeleton itt létrehoz egy új útelemet, így rá fog kérdezni a jármű elhelyezésére." );
					Logger.turnOff();
					_destinationRSW = new RoadSegmentWrapper( new RoadSegment() );
					Logger.turnOn();
				}
			}
			else
			{
				Logger.ret();
				return;
			}
		}

		if ( _destinationRSW == null )
		{
			Logger.ret();
			return;
		}

		Logger.ret();
	}

	public void setCurrentRS( RoadSegment _currentRS )
	{
		this._currentRS = _currentRS;
	}

	public RoadSegment getCurrentRS()
	{
		return _currentRS;
	}

}
